package tp.pr5.mv.window;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import tp.pr5.mv.CPU;
import tp.pr5.mv.Controller;
import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.ProgramMV;

@SuppressWarnings("serial")
public class PanelPush extends JPanel implements CPU.Observer {

	// Panel que permite apilar elementos en la pila de la CPU
	 
	private JLabel valorPila;
	private JTextField textoValPila;
	private JButton push;
	
	public PanelPush( Controller controller) {
		
		super( new FlowLayout() );
		init(controller);
		
	}
	
	
	public void init(final Controller controller) {
		
		valorPila = new JLabel("Valor: ");
		add(valorPila);
		
		textoValPila = new JTextField();
		textoValPila.setEditable(true);
		textoValPila.setColumns(5);
		add(textoValPila);
		
		push = new JButton("Push");
		push.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) { // Al pulsar el boton hacemos push del valor del JTextField y repintamos la pila de la ventana
				
				    try {
						int val = Integer.parseInt(textoValPila.getText());
						controller.requestPush(val);
					}
					catch ( java.lang.NumberFormatException ex ) {
						/// No queremos que la máquina haga nada en esta situación.
					}
				
				
			}
			
		});
		add(push);
		
		
		
	}


	@Override
	public void onStartInstrExecution(Instruction ins) {}


	@Override
	public void onEndInstrExecution(Instruction instr, Memory mem,
			OperandStack stack, ProgramCounter pc) {}


	@Override
	public void onHalt() {}


	@Override
	public void onReset(ProgramMV program) {}


	@Override
	public void onStartRun() { // Desactiva el botón y el TextField
		push.setEnabled(false);
		textoValPila.setEnabled(false);
	}


	@Override
	public void onEndRun(boolean aborted) {
		push.setEnabled(true);
		textoValPila.setEnabled(true);
	}


	@Override
	public void onTrap(Instruction instr, String trapMessage) {}

}
